package com.zhb.cloud.eureka;

import com.google.inject.AbstractModule;
import com.netflix.appinfo.EurekaInstanceConfig;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.discovery.guice.EurekaModule;
import com.netflix.governator.InjectorBuilder;
import com.netflix.governator.LifecycleInjector;

/**
 * Sample Eureka service that registers with Eureka to receive and process
 * requests, using EurekaModule.
 */
public class ExampleEurekaGovernatedService {

	static class ExampleServiceModule extends AbstractModule {
		@Override
		protected void configure() {
			bind(ExampleServiceBase.class).asEagerSingleton();
		}
	}

	private static LifecycleInjector init() throws Exception {
		System.out.println("Creating injector for Example Service");

		LifecycleInjector injector = InjectorBuilder.fromModules(new EurekaModule(), new ExampleServiceModule())
				.overrideWith(new AbstractModule() {
					@Override
					protected void configure() {
						DynamicPropertyFactory configInstance = com.netflix.config.DynamicPropertyFactory.getInstance();
						bind(DynamicPropertyFactory.class).toInstance(configInstance);
						// the default impl of EurekaInstanceConfig is CloudInstanceConfig, which we
						// only want in an AWS
						// environment. Here we override that by binding MyDataCenterInstanceConfig to
						// EurekaInstanceConfig.
						bind(EurekaInstanceConfig.class).to(MyDataCenterInstanceConfig.class);

						// (DiscoveryClient optional bindings) bind the optional event bus
						// bind(EventBus.class).to(EventBusImpl.class).in(Scopes.SINGLETON);
					}
				}).createInjector();

		System.out.println("Done creating the injector");
		return injector;
	}

	public static void main(String[] args) throws Exception {
		LifecycleInjector injector = null;
		try {
			injector = init();
			injector.awaitTermination();
		} catch (Exception e) {
			System.out.println("Error starting the sample service: " + e);
			e.printStackTrace();
		} finally {
			if (injector != null) {
				injector.shutdown();
			}
		}
	}

}
